
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>ES如何处理数据的分布和均衡？如何在集群中重新分配分片？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>ES如何处理数据的分布和均衡？如何在集群中重新分配分片？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在 Elasticsearch 中，主分片（primary shard）和副本分片（replica shard）的核心职责分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主分片是数据的原始副本，用于接收和存储文档，每个文档只属于一个主分片。副本分片是主分片的复制，主要用于提高数据的可用性和容错能力，当主分片所在的节点出现故障时，副本分片可以替代主分片提供服务。</div>
          </div>
          <div class="card-source">来源: 1. 数据的分布和均衡</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当一个新文档被写入 Elasticsearch 索引时，系统是如何决定它应该被存储在哪一个主分片上的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当一个文档被写入索引时，Elasticsearch 会根据文档的 `_id` 通过哈希函数计算出文档应该存储的主分片。然后，文档被写入到计算出的主分片所在的节点，并由该主分片负责将文档同步到所有的副本分片。</div>
          </div>
          <div class="card-source">来源: 数据分布的关键点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了确保高可用性并避免单点故障，Elasticsearch 在分配主分片及其副本分片时遵循了什么关键策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch 采用了一种智能的分片分配策略，确保主分片和其副本分片不会被分配在同一个节点上。这样可以避免因单个节点故障而同时影响主分片和副本分片。</div>
          </div>
          <div class="card-source">来源: 数据分布的关键点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是 Elasticsearch 的分片重新分配（Rebalancing）过程，其主要目的是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分片的重新分配是指在 Elasticsearch 集群中，将分片从一个节点移动到另一个节点的过程。其主要目的是为了保证集群的负载均衡和数据的高可用性。</div>
          </div>
          <div class="card-source">来源: 2. 分片的重新分配（Rebalancing）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">请列举至少三种会触发 Elasticsearch 分片重新分配的常见场景。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">常见的触发条件包括：1. 新增节点加入集群；2. 集群中有节点发生故障或宕机；3. 节点从集群中被移除（如进行维护）；4. 管理员通过 API 手动触发。</div>
          </div>
          <div class="card-source">来源: 2. 分片的重新分配（Rebalancing）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在 Elasticsearch 集群中，哪个节点负责协调分片的重新分配？该过程包含哪些主要步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分片重新分配由主节点（Master Node）负责协调。具体步骤包括：1. 分片状态检测；2. 根据集群状态和策略做出分配决策；3. 将分片数据从源节点迁移到目标节点；4. 迁移完成后更新集群状态。</div>
          </div>
          <div class="card-source">来源: 分片重新分配的机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Elasticsearch 的磁盘水位策略（Disk Watermarking）是如何帮助管理分片分配以防止节点磁盘过载的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">磁盘水位策略通过配置 `cluster.routing.allocation.disk.watermark` 来设置磁盘的高水位和低水位。当节点磁盘使用率超过高水位时，Elasticsearch 会自动将该节点上的分片重新分配到磁盘使用较少的节点上，从而避免磁盘被占满。</div>
          </div>
          <div class="card-source">来源: 4. 管理和配置分片重新分配</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">除了集群内部状态和配置策略，还有什么外部因素会直接影响分片重新分配的速度和效率？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">网络带宽是影响分片重新分配效率的一个重要外部因素。因为重新分配过程需要在节点之间传输数据，所以网络带宽的大小和稳定性会直接影响数据迁移的速度和效率。</div>
          </div>
          <div class="card-source">来源: 3. 影响分片重新分配的因素</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当需要对分片进行手动干预时，例如为了解决性能问题而移动特定分片，管理员应该使用哪个 API？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">管理员可以使用 `/_cluster/reroute` API 来手动控制分片的分配过程。例如，在特定场景下，可以手动将分片从一个节点移动到另一个节点。</div>
          </div>
          <div class="card-source">来源: 4. 管理和配置分片重新分配</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
